package xfuzzy.alg_genetico.indeterminado.xfghlOld.model.hierStruct;

/**
 * Clase que representa un nodo final, contiene un valor entero e implementa la interfaz XfghlINode
 * @author Sergio Cala Cordero, Septiembre 2009, Herramienta Xfghl
 *
 */
public class XfghlNode implements XfghlINode {

	/**
	 * Nos dice que el Nodo corresponde a una variable de entrada
	 */
	public static final int INPUT=1;
	
	/**
	 * Nos dice que el Nodo corresponde a una variable interna
	 */
	public static final int INNER=2;

	/**
	 * Nos dice que el Nodo corresponde a una variable de salida
	 */
	public static final int OUTPUT=3;	
	
	/**
	 * Valor del nodo
	 */
	private int valor;
	
	/**
	 * Nos dice el tipo de variable que es, INPUT, INNER, OUTPUT
	 */
	private int type;
	
	/**
	 * Constructor
	 * @param valor valor entero del nodo
	 */
	public XfghlNode(int valor,int type)
	{
		this.valor=valor;
		this.type=type;
	}

	/**
	 * Getter and setter
	 * @return valor
	 */
	public int getValor()
	{
		return valor;
	}
	
	/**
	 * Getter and setter
	 * @return valor
	 */
	public int getType()
	{
		return this.type;
	}

	
	/**
	 * M�todo que imprime el valor del nodo, implementa la interfaz XfghlINodo
	 * 
	 */
	public void imprime() {
		
		String tipo;
		if(this.type==XfghlNode.INNER)
			tipo="Inner  ";
		else if(this.type==XfghlNode.INPUT)
			tipo="InPut  ";
		else
			tipo="OutPut ";
		
		System.out.println(tipo+valor);
	}
	
	
	/**
	 * M�todo que devuelve el nodo actual, implementa la interfaz XfghlINodo
	 * @return XfghlNodo this
	 */
	public XfghlINode insert()
	{
		return this;
	}
	
	
	/**
	 * M�todo que nos permite copiar un XfghlNode o a�adir un XfghlNode a un XfghlModule.
	 * @param par valor nos dice si estamos buscando un M�dulo (0) o un Nodo (1)
	 * MODULO (par=0): Copia un MODULO a�adiendole un nuevo m�dulo que es ent1 del modulo indicado,
	 * 	sus variables son  sal= var+1, ent2=var+2 y su id es idNuevoMod
	 * NODO (par=1): Copia un NODO que va a convertirlo en m�dulo, d�nde sal es el valor del Nodo, el idModulo
	 * es idNuevoMod, ent1 es var+1,ent2 es var+2.
	 * @param numMod N�mero de m�dulos del XfghlModule
	 * @param idNuevoMod Identificador del nuevo m�dulo
	 */	
	public XfghlINode insert(XfghlCounter count,int idNuevoMod){
		
		//Si el contador es igual a cero tenemos que crear un nuevo m�dulo
		if(count.getCounter()==0)		
		{   
			//Decrementamos el contador
			count.decrease();
	    	//Nos creamos la variable interna
			XfghlNode nodeInner=new XfghlNode(idNuevoMod-1,XfghlNode.INNER);
			//Nos creamos el nuevo nodo de entrada
			XfghlNode nodeInput=new XfghlNode(idNuevoMod+1,XfghlNode.INPUT);						
			//This es un nodo INPUT
			return new XfghlModule(this,nodeInput,nodeInner,idNuevoMod);
		}
		else
		{
			count.decrease();
			return this;
		}
				
	}
}
